/* Copyright (c) [2025] [zhi1208@126.com]
 * SPDX-License-Identifier: MIT
 */

#pragma once

/*********************
 *      INCLUDES
 *********************/
#include <stdint.h>

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/
typedef void (*sw_i2c_set_scl_with_delay)(uint8_t value);
typedef void (*sw_i2c_set_sda_with_delay)(uint8_t value);
typedef uint8_t (*sw_i2c_read_sda)(void);

typedef struct
{
    uint8_t wr_addr;
    uint8_t rd_addr;

    sw_i2c_set_scl_with_delay set_scl;
    sw_i2c_set_sda_with_delay set_sda;
    sw_i2c_read_sda read_sda;
} sw_i2c_t;

/**********************
 * GLOBAL PROTOTYPES
 **********************/
void sw_i2c_start(sw_i2c_t *sw_i2c);
void sw_i2c_stop(sw_i2c_t *sw_i2c);
void sw_i2c_send_ack(sw_i2c_t *sw_i2c, uint8_t ack);
uint8_t sw_i2c_recv_ack(sw_i2c_t *sw_i2c);
void sw_i2c_send_byte(sw_i2c_t *sw_i2c, uint8_t byte);
uint8_t sw_i2c_recv_byte(sw_i2c_t *sw_i2c);

/**********************
 *      MACROS
 **********************/